package com.ruoyi.xuexiao.service.impl;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.uuid.UUID;
import com.ruoyi.xuexiao.domain.param.KsFileDtoParam;
import com.ruoyi.xuexiao.domain.entity.KsFile;
import com.ruoyi.xuexiao.domain.entity.KsJbxxhz;
import com.ruoyi.xuexiao.domain.param.KsFileRequestParam;
import com.ruoyi.xuexiao.domain.vo.KsFileReturnVo;
import com.ruoyi.xuexiao.mapper.KsFileMapper;
import com.ruoyi.xuexiao.mapper.KsJbxxhzMapper;
import com.ruoyi.xuexiao.service.KsFileService;
import io.netty.util.internal.StringUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;


/**
 * 矿山文件
 *
 * @author 郭梓强
 * @since 2024年5月28日08:50:42
 */
@Service
public class KsFileImpl extends ServiceImpl<KsFileMapper, KsFile> implements KsFileService {

    @Value("${minefile.uploaddirdisc}")
    private String filePath;

    @Value("${minefile.prexypathaccess}")
    private String imgUrl;

    private final KsJbxxhzMapper ksJbxxhzMapper;

    private final KsFileMapper jgKsFileMapper;

    public KsFileImpl(KsJbxxhzMapper ksJbxxhzMapper, KsFileMapper jgKsFileMapper) {
        this.ksJbxxhzMapper = ksJbxxhzMapper;
        this.jgKsFileMapper = jgKsFileMapper;
    }


    /**
     * 获取矿山文件
     *
     * @author 郭梓强
     * @since 2024年5月28日08:59:22
     */
    @Override
    public List<KsFileReturnVo> selJgKsFile(KsFileRequestParam ksFileRequestParam) {
        List<KsFile> jgKsFiles = jgKsFileMapper.selectList(Wrappers.<KsFile>lambdaQuery()
                // lambdaQuery 构建查询条件
                .eq(!StringUtil.isNullOrEmpty(ksFileRequestParam.getXkzh()), KsFile::getXkzh, ksFileRequestParam.getXkzh())//许可证号
        );
        return BeanUtil.copyToList(jgKsFiles, KsFileReturnVo.class);
    }

    /**
     * 上传矿山文件
     *
     * @author 郭梓强
     * @since 2024年5月28日08:52:14
     */
    @Override
    public String jgUploadFile(KsFileDtoParam ksFileDtoParam, HttpServletRequest request) throws IOException {
        // 格式化日期
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyy-MM-dd");
        // 获取上传的文件
        MultipartFile file = ksFileDtoParam.getFile();
        // 格式化当前日期和时间
        String div = simpleDateFormat.format(new Date());
        // 获取文件扩展名
        String extension = FileUploadUtils.getExtension(file);
        // 创建一个表示目录路径的File对象
        File pathName = new File(filePath + "/" + div);
        // 检查目录是否不存在，不存在则创建目录及其必要的父目录
        if (!pathName.exists()) {
            pathName.mkdirs();
        }
        // 打印图像保存的位置
        System.out.println("图片上传，保存位置：" + filePath + div);
        String url = null; // 用于保存URL的变量
        // 允许上传的文件扩展名数组
        String[] allowedExtensions = new String[]{".pdf", ".jpeg", ".jpg", ".png"};
        boolean extensionAllowed = false; // 用于标记是否允许上传的标志
        // 遍历允许上传的文件扩展名数组，检查文件扩展名是否匹配
        String flag = null;
        for (String suffix : allowedExtensions) {
            if (("." + extension).equalsIgnoreCase(suffix)) {
                extensionAllowed = true;
                flag = "." + extension;
                break;
            }
        }

        //根据许可证好查询出对应数据
        KsJbxxhz existingRecord = ksJbxxhzMapper.selectOne(
                Wrappers.lambdaQuery(KsJbxxhz.class)
                        .eq(!StringUtil.isNullOrEmpty(ksFileDtoParam.getXkzh()), KsJbxxhz::getXkzh, ksFileDtoParam.getXkzh())//许可证号
        );
        File destinationFile = null;
        String kyqr = null;
        if (!flag.equals(".pdf")) {
            url = upload(file, existingRecord, kyqr);
        } else {
            // 生成一个唯一的文件名
            String uniqueFileName = UUID.randomUUID().toString().replace("-", "");
            kyqr = existingRecord.getKyqr() + "_" + uniqueFileName + "." + extension;
            // 创建一个表示文件路径的File对象
            //A:/file/yyy-MM-ddXXX公公司（盘路径）
            destinationFile = new File(filePath + "/" + div + "/" + kyqr);
            // 将文件传输到指定位置
            file.transferTo(destinationFile);
            // 构造上传文件的URL
            url = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + "/image/" + div + "/" + kyqr;
        }
        if (existingRecord == null) {

            throw new RuntimeException("上传数据丢失从新上传或联系管理员");
        }
        if (extensionAllowed) {
            Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
            LoginUser principal = (LoginUser) authentication.getPrincipal();
            // 获取上传文件的原始文件名
            String originalFileName = file.getOriginalFilename();
            KsFile ksFile = new KsFile();
            ksFile.setXkzh(existingRecord.getXkzh());//许可证号
            ksFile.setXdlj(url);//相对路径
            ksFile.setJdlj(String.valueOf(destinationFile));//绝对路径
            ksFile.setWjlx(extension);//后缀名称
            ksFile.setWjdx(file.getSize() / 1024 + "KB");//文件大小
            ksFile.setScr(principal.getUserId());//当前上传人
            ksFile.setScsj(new Date());//上传时间
            ksFile.setWjmc(originalFileName);//文件名称
            ksFile.setXfrq(ksFileDtoParam.getXfrq());//上传时间
            ksFile.setCsbs(ksFileDtoParam.getCsbs());//初室标识
            //ksFile.setXdlj("/image/" + div +"/"+ kyqr);//相对路径
            jgKsFileMapper.insert(ksFile);
        }
        return url;
    }

    public String upload(MultipartFile file, KsJbxxhz existingRecord, String kyqr) throws IOException {
        // 获取文件扩展名
        String extension = FileUploadUtils.getExtension(file);
        // 创建一个表示目录路径的File对象
        File pathName = new File(filePath + "/");
        // 检查目录是否不存在，不存在则创建目录及其必要的父目录
        if (!pathName.exists()) {
            pathName.mkdirs();
        }
        // 生成一个唯一的文件名
        String uniqueFileName = UUID.randomUUID().toString().replace("-", "");
        kyqr = existingRecord.getKyqr() + "_" + uniqueFileName + "." + extension;
        // 创建一个表示文件路径的File对象
        //A:/file/yyy-MM-ddXXX公公司（盘路径）
        File destinationFile = new File(filePath + kyqr);
        // 将文件传输到指定位置
        file.transferTo(destinationFile);
        String url = imgUrl + kyqr;
        System.out.println("图片上传，访问URL：" + url);
        return url;
    }


    /**
     * 删除-附件上传
     *
     * @author 郭梓强
     * @since 2024年5月28日08:53:54
     */
    @Override
    public boolean delJdKsFile(Integer id) {
        int i = jgKsFileMapper.deleteById(id);
        // 如果受影响的行数大于 0，则表示删除成功，返回 true；否则返回 false
        return i > 0;
    }


    /**
     * 获取静态文件的字节数组表示形式。
     *
     * @param fileName 文件名
     * @return 包含文件内容的字节数组
     * @throws IOException 如果无法读取文件或文件不存在
     */
    @Override
    public byte[] getStaticFile(String fileName) throws IOException {
        byte[] imageBytes = readImageToByteArray(fileName);
        return imageBytes;
    }

    /**
     * 读取图像文件并将其转换为字节数组。
     *
     * @param filePath 图像文件的路径
     * @return 包含图像内容的字节数组
     * @throws IOException 如果无法读取文件或文件不存在
     */
    public static byte[] readImageToByteArray(String filePath) throws IOException {
        Path path = Paths.get(filePath);
        return Files.readAllBytes(path);
    }

}
